#include "Builder.h"

//Constructeur
Builder::Builder()
{
	qDebug() << "Info : start Builder...";
        VCM_ReferenceFilePath = "";
        VCM_OutputFilePath = "";
        VLM_LatestError = BUILDER_NO_ERROR;
}
//Destructeur
Builder::~Builder()
{
	qDebug() << "Info :  stop Builder...";
}
//InsÃ¨re la liste Ã  traiter
void Builder::setLists(QList<UpdateFile*> OMP_Files)
{
        OMM_ListFilesToTreate = OMP_Files;
}
//InsÃ¨re le chemin de rÃ©fÃ©rence
void Builder::setReferenceFilePath(QString VCP_RefFilePath)
{
        VCM_ReferenceFilePath = VCP_RefFilePath;
}
//SpÃ©cifie le fichier de sortie
void Builder::setOutPutFilePath(QString VCP_RefFilePath)
{
        VCM_OutputFilePath = VCP_RefFilePath;
}
void Builder::run()
{
    VLM_LatestError = BUILDER_NO_ERROR;
    //InterfaceArchiver * archives =new InterfaceArchiver();
    QString MCL_CurrentFilePath = "";
    int count;
    QFile VXL_UpdateListFile(VCM_OutputFilePath);
    QFileInfo VXL_UpdateListFileInfo;
    QDir VXL_UpdateListDir;
    //On vÃ©rirife l'existence du dossier
    VXL_UpdateListFileInfo.setFile(VXL_UpdateListFile);
    VXL_UpdateListDir = VXL_UpdateListFileInfo.absoluteDir();
    if(!VXL_UpdateListDir.exists())
    {
       VXL_UpdateListDir.mkpath(VXL_UpdateListFileInfo.absolutePath());
    }
    else
    {
        //On vÃ©rifie la prÃ©sence du fichier
        if(VXL_UpdateListFile.exists())
        {
            //On le supprime
            VXL_UpdateListFile.remove();
        }
    }

    //On ouvre le fichier
    if (!VXL_UpdateListFile.open(QIODevice::WriteOnly | QIODevice::Text))
    {
            emit NotifyErrorMsg("Unable to open UpdateList File");
            VLM_LatestError = BUILDER_ERROR_CANT_OPEN_FILE;
            return;
    }
    //On crÃ©Ã© le buffer pour insÃ¨rer du texte
    QTextStream VXL_OutTextStream(&VXL_UpdateListFile);
    count = OMM_ListFilesToTreate.size();
    VXL_OutTextStream << "[files]" <<"\n" << "fcount=" << count << "\n";
    for(int i=0; i<OMM_ListFilesToTreate.size();i++)
    {
        MCL_CurrentFilePath = 	OMM_ListFilesToTreate[i]->getPath() + "/"
                + OMM_ListFilesToTreate[i]->getFilename().section('/', -1);
        qDebug() << MCL_CurrentFilePath;
        //On calcul le hash du fichier
        OMM_ListFilesToTreate[i]->setSha1(CalcSha1(MCL_CurrentFilePath));

        //Si demandÃ©, on affiche le fichier en cours de traitement
        #ifdef ENABLE_DEBUG_SHOWLISTS
            #ifdef QT_DEBUG
                    qDebug()    << "File :" << i+1 << "/" <<OMM_ListFilesToTreate.size()
                                << OMM_ListFilesToTreate[i]->getFilename() 	<< "|"
                                << OMM_ListFilesToTreate[i]->getpriority()	<< "|"
                                << OMM_ListFilesToTreate[i]->getPath()		<< "|"
                                << OMM_ListFilesToTreate[i]->getSha1() ;
            #endif //QT_DEBUG
        #endif //ENABLE_DEBUG_SHOWLISTS

        //On Ã©cris la ligne qui le concerne
        if(QString::compare(MCL_CurrentFilePath, VCM_ReferenceFilePath) == 0)
        {//Fichier de rÃ©fÃ©rence

        }
        else
        {//Fichier "normal"
                    count++;
            VXL_OutTextStream     << "F"<<i<<"="
            << OMM_ListFilesToTreate[i]->getFilename() 	<< "|"
            << OMM_ListFilesToTreate[i]->getSha1()		<< "|"
            << OMM_ListFilesToTreate[i]->getpriority()
            << "\n";
        }
        /***********TODO****************/
        QString fileToCopy(OMM_ListFilesToTreate[i]->getPath() + "/"
                           + OMM_ListFilesToTreate[i]->getFilename().section('/', -1));
        QString subPath(OMM_ListFilesToTreate[i]->getFilename().section('/', 0, -2));
        VXL_UpdateListDir.mkpath(subPath);
        QFile::copy(fileToCopy, VCM_ReferenceFilePath+OMM_ListFilesToTreate[i]->getFilename());
        // QFile::copy(OMM_ListFilesToTreate[i]->getFilename(),OMM_ListFilesToTreate[i]->getFilename());
        // On Maj la ProgressBar
        emit NotifyProgress(i+1,OMM_ListFilesToTreate.size());
    }
    return;
}
int Builder::getLatestError()
{
    return VLM_LatestError;
}
QString Builder::CalcSha1(QString MCP_AbsolutePath)
{
	//CrÃ©ation d'un objet Qt reprÃ©sentant un fichier pour le lire
	QFile FileToHash(MCP_AbsolutePath);
	
	//Creation d'un tableau de Bytes
	QByteArray MXL_Bytes;
	
	//CrÃ©ation d'un QCryptographicHash SHA1
	QCryptographicHash CPU(QCryptographicHash::Sha1);
	
	//On ouvre le fichier
	if (FileToHash.open(QIODevice::ReadOnly))
	{
		//on parcours le fichier jusqu'a la fin
		while (!FileToHash.atEnd())
		{
			//On stoque dans le tableau de Byte 1024 Octects
			MXL_Bytes = FileToHash.read(1024);
			
			//on donne les Octects Ã  manger au QCryptographicHash
			CPU.addData(MXL_Bytes);
		}
		FileToHash.close();
		
		//On demande au QCryptographicHash de nous donner le hash (en Hexa)
		MXL_Bytes = CPU.result();
		
		//On transforme l'hexa en String pour pas s'embeter avec
		QString MCL_HashOutput(MXL_Bytes.toHex());
		return MCL_HashOutput;
	}
	else
	{
		emit NotifyErrorMsg("Impossible de claculer le Hash du fichier" + MCP_AbsolutePath);
		//Impossible d'ouvrir le fichier : on renvoie une String pourrave
		QString MCL_HashOutput("ERR");
		return MCL_HashOutput;
	}
}
